package com.cskaoyan.basic._2variable._3notice;

/**
 * Java中变量的数据类型由某一种转换为另一种，我们将这个过程叫做数据类型转换。
 * 基本数据类型和引用数据类型变量都可以做类型转换。
 * 今天我们先学习基本数据类型的类型转换。
 *
 * 数据类型的转换又可以分为两类：
 *      1.自动类型转换
 *      2.强制类型转换
 *
 * 当然，首先要明确的是：基本数据类型的数据类型转换必须在byte、short、int、long、float、double这些数值类型和char类型之间进行，boolean类型不参与基本数据类型的数据类型转换。
 *
 * 1.基本数据类型的自动类型转换
 *      编译器帮助我们完成类型转换，这意味着我们程序员不需要写额外代码，就可以自动完成类型转换。
 *      条件：
 *      对于基本数据类型而言，自动数据类型发生在"小取值范围"转换为"大取值范围"的数据类型转换之间
 *      “小转大”是自动类型转换，自动完成，无需写额外代码。
 *
 *      注意：由于浮点数存在精度问题，自动类型转换也有可能出现精度丢书数据失真的情况。
 *
 * 1.基本数据类型的强制类型转换
 *      自动类型转换相对应的就是强制类型转换，是从"大取值范围"的数据类型转换到"小取值范围"的数据类型。
 *      这个过程编译器不会自动完成，需要程序员手动写代码完成类型转换
 *      语法：
 *        强转后的类型 变量名 =  (强转后的类型)被强调数据类型的变量名
 *
 *     强转在绝大多数情况下都会导致数据溢出失真，是一个很危险的事情
 *     做强转要谨慎考虑，避免出现数据失真，导致程序错误。
 *
 *
 * @since 09:45
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        // double --> float是大到小，不是自动类型转换
        float a = (float) 0.1;
        // int --> long是小到大，是自动类型转换，无需写额外代码
        long b = 100;

        short c = 1000;
        // short --> char 不行,装不下
        // char d = c;
        int d = c;

        // float有效位数是7~8位
        int num = 123456789;
        float numF = num;
        System.out.println(numF);

        double doubleNum = 123.123;
        // 强转去掉小数
        /*
            强转语法的快捷键
                1. 在被强转变量的后面写.cast
                2. 直接不管强转直接写语句，然后alt+回车报错的位置

            ((int) doubleNum)这个强转的语法是有结果的
            这种有结果的语句，一般的做法是从左往后写
            但是更加推荐的做法是从右往左写
                因为从右边开始写  可以自动生成左边的代码，不需要手写
                1. 在有结果的表达式后面写.var
                2. 直接快捷键 ctrl + alt + v自动生成左边
         */
        int intNum = (int) doubleNum;
        int intNum2 = ((int) doubleNum);
        int intNum3 = (int) doubleNum;
        System.out.println(intNum);
    }
}
